// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@

#ifndef TMRM_H_
#define TMRM_H_

#include "tmmutex.h"

class CTmTxBase;
class CTmTxMessage;

// Pure virtual base class for Branches
class RM_Info
{
    protected:
      int      iv_num_rm_partic;
      TM_Mutex iv_branch_mutex;

    public:
      RM_Info(){iv_num_rm_partic=0;}
      ~RM_Info(){}
      void branch_lock();
      void branch_unlock();
      virtual void inc_num_rm_partic() {RM_Info::iv_num_rm_partic++;}

      virtual int32 num_rm_partic(CTmTxBase *pp_txn = 0) = 0;
      virtual int32 num_rms_unresolved(CTmTxBase *pp_txn = 0) = 0;
      virtual void reset_resolved(CTmTxBase *pp_txn = 0) = 0;
      virtual int32 num_rm_failed(CTmTxBase *pp_txn = 0) = 0;
      virtual void init_rms(CTmTxBase *pp_txn, bool pv_partic) = 0;

      virtual int32 shutdown_branches(bool pv_leadTM, bool pv_clean) = 0;
      
      // Generic branch interface
      virtual int32 commit_branches (CTmTxBase *pp_txn, int64 pv_flags, CTmTxMessage * pp_msg) = 0;    
      virtual int32 end_branches (CTmTxBase *pp_txn, int64 pv_flags) = 0;  
      virtual int32 forget_branches (CTmTxBase *pp_txn, int64 pv_flags) = 0;    
      virtual int32 forget_heur_branches (CTmTxBase *pp_txn, int64 pv_flags) = 0; 
      virtual int32 prepare_branches (CTmTxBase *pp_txn, int64 pv_flags, CTmTxMessage * pp_msg) = 0;
      virtual int32 rollback_branches (CTmTxBase *pp_txn, int64 pv_flags, CTmTxMessage * pp_msg,
                              bool lv_error_condition = false) = 0;       
      virtual int32 start_branches (CTmTxBase *pp_txn, int64 pv_flags, CTmTxMessage * pp_msg) = 0;
      virtual int32 registerRegion (CTmTxBase *pp_txn, int64 pv_flags, CTmTxMessage * pp_msg) = 0;
};
 
#endif // TMRM_H_